package com.zzti.sys.service;

import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import com.zzti.pay.alipay.AlipayWap;
import com.zzti.pay.utils.DateUtils;
import com.zzti.pay.utils.DownloadFile;
import com.zzti.pay.utils.JsonUtils;

@Service
public class AlipayService {
	private static final Logger log = LoggerFactory.getLogger(AlipayService.class);
	@Autowired
	AlipayWap AlipayWap;
	/**
	 * 支付宝支付接口
	 * 
	 * @param httpResponse
	 *            响应对象
	 * @param subject
	 *            订单标题
	 * @param totalAmount
	 *            订单总金额，单位为元，精确到小数点后两位，取值范围[0.01,100000000]
	 * @param tradeNo
	 *            商户订单号，需要保证不重复
	 */
	public void toPay(HttpServletResponse httpResponse, String subject, String total_amount, String out_trade_no) {
		AlipayWap.toPay(httpResponse, subject, total_amount, out_trade_no);
	}

	
	/**
	 * 支付宝同步通知
	 * 每次支付只调用一次，有可能随着用户关闭浏览器而不调用，
	 * 所以不做订单更改业务处理，只做个性化展示支付数据）
	 *
	 * @param request
	 * @return
	 */
	public String returnUrl(HttpServletRequest request) {
		Map<String, String> paramsMap = new HashMap<String, String>();
		// 获取支付宝get过来反馈信息
		Map<String, String[]> requestParams = request.getParameterMap();
		for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
			String name = (String) iter.next();
			String[] values = (String[]) requestParams.get(name);
			String valueStr = "";
			for (int i = 0; i < values.length; i++) {
				valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
			}
			// 乱码解决，这段代码在出现乱码时使用
			// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
			paramsMap.put(name, valueStr);
		}
		System.out.println(JsonUtils.objectToJson(paramsMap));
		log.info("支付宝同步通知数据" + JsonUtils.objectToJson(paramsMap));
		
		String  out_trade_no = 	paramsMap.get("out_trade_no"); // 商户订单号 	
		String  trade_no = 	paramsMap.get("trade_no"); // 支付宝交易订单号
		String total_amount = paramsMap.get("total_amount"); // 支付宝交易总金额
//		String app_id = paramsMap.get("app_id"); // 商户的app_id
		
		// 在这里做具体的参数处理
		StringBuffer result = new StringBuffer();
		result.append("支付宝交易订单号:").append(trade_no);
		result.append("支付宝交易总金额：").append(total_amount).append("元");
		result.append("本次交易订单号：").append(out_trade_no);
		return result.toString();
	}
	/**
	 * 支付宝异步通知验签
	 *
	 * @param request
	 *            请求体
	 * @return 通知支付宝成功还是失败
	 */
	public String notify(HttpServletRequest request) {
		String str = AlipayWap.AsynchronousNotifyCheck(request);
		log.info("支付宝异步通知验签数据" + str);
		return str;
	}

	/**
	 * 交易查询接口
	 * 
	 * @param out_trade_no
	 *            支付时传入的商户订单号，与trade_no必填一个
	 * @param trade_no
	 *            支付时返回的支付宝交易号，与out_trade_no必填一个
	 * @return trade_no 支付宝28位交易号 out_trade_no 支付时传入的商户订单号 trade_status 交易当前状态
	 */
	public String tradeQuery(String out_trade_no, String trade_no) {
		String str = AlipayWap.tradeQuery(out_trade_no, trade_no);
		// str 中包含这几个参数，根据需求进行取用
		// trade_no 支付宝28位交易号 out_trade_no 支付时传入的商户订单号 trade_status 交易当前状态
		log.info("支付宝交易查询接口数据" + str);
		return str;
	}

	/**
	 * 交易退款接口alipay.trade.refund
	 *
	 * @param out_trade_no
	 *            支付时传入的商户订单号，与trade_no必填一个
	 * @param trade_no
	 *            支付时返回的支付宝交易号，与out_trade_no必填一个
	 * @param out_request_no
	 *            本次退款请求流水号，部分退款时必传
	 * @param refund_amount
	 *            本次退款金额
	 * @return refund_fee 该笔交易已退款的总金额
	 */
	public String tradeRefund(String out_trade_no, String trade_no, String out_request_no, String refund_amount) {
		return AlipayWap.tradeRefund(out_trade_no, trade_no, out_request_no, refund_amount);
	}

	/**
	 * 查询对账单下载地址
	 * 
	 * @param bill_type
	 *            固定传入 "trade"
	 * @param bill_date
	 *            需要下载的账单日期，最晚是当期日期的前一天(格式为：2016-04-05)
	 * @return 账单文件下载地址，30秒有效
	 */
	public String queryBillDownloadurl(String bill_type, String bill_date) {
		return AlipayWap.queryBillDownloadurl("trade", bill_date);
	}

	/**
	 * 下载电子对账单(需调试暂不能使用)
	 *
	 * @param request
	 *            请求
	 * @param response
	 *            响应
	 * @param date
	 *            日期格式（2019-04-07）
	 */
	public void downloadAlipayFile(HttpServletRequest request, HttpServletResponse response, Date date) {
		String dateStr = DateUtils.dateToString(date);
		String url = queryBillDownloadurl("trade", dateStr);
		log.info("电子对账单下载地址：",url);
		try {
			DownloadFile.downloadToExplorerFormUrl(url, request, response);
		} catch (Exception e) {
			log.error("支付宝——文件下载失败");
			e.printStackTrace();
		}
	}

}
